package samber

import (
	"fmt"
	"github.com/samber/lo"
	"strconv"
)

// Ternary 三元符
func Ternary() {
	result := lo.Ternary(true, "a", "b")
	fmt.Printf("%v\n", result) // a
}

// TernaryF 函数的三元符
func TernaryF() {
	result := lo.TernaryF(true, func() string { return "a" }, func() string { return "b" })
	fmt.Printf("%v\n", result) // a
}

// Times 重复N次形成新数组 i 从0开始
func Times() {
	result := lo.Times(3, func(i int) string {
		return strconv.FormatInt(int64(i), 10)
	})
	fmt.Printf("%v\n", result) // [0 1 2]
}

// ToAnySlice 转为any类型
func ToAnySlice() {
	list := []int{1, 2, 3}
	res := lo.ToAnySlice(list)
	fmt.Printf("%v\n", res) // [1 2 3]
}

// ToPtr 单个转Ptr
func ToPtr() {
	one := foo{}
	onePtr := lo.ToPtr(one)
	fmt.Printf("%v\n", onePtr) // &{ }
}

// ToSlicePtr 数组转Ptr
func ToSlicePtr() {
	list := []foo{{}, {bar: "1"}}
	listPtr := lo.ToSlicePtr(list)
	fmt.Printf("%v\n", listPtr) // [0xc00005a060 0xc00005a080]
}

// Try 执行函数判断是否返回err
func Try() {
	ok2 := lo.Try(func() error {
		return fmt.Errorf("my error")
	})
	fmt.Printf("%v\n", ok2) // false
}

// TryCatch 如果为错误之后执行catch逻辑
func TryCatch() {
	lo.TryCatch(
		func() error {
			panic("try: trigger an error")
		},
		func() {
			fmt.Printf("catch: error\n") // 输出
		},
	)
}

// TryCatchWithErrorValue 捕捉到错误且能把错误传到catch中
func TryCatchWithErrorValue() {
	lo.TryCatchWithErrorValue(
		func() error {
			panic("trigger an error")
		},
		func(err any) {
			fmt.Printf("catch: %s\n", err) // catch: trigger an error
		},
	)
}

// TryOr 发生错误则返回目标值
func TryOr() {
	value2, ok2 := lo.TryOr(func() (int, error) {
		return 42, fmt.Errorf("my error")
	}, 21)
	fmt.Printf("%v %v\n", value2, ok2) // 21 false
}

func TryWithErrorValue() {
	err3, ok3 := lo.TryWithErrorValue(func() error {
		panic("my error")
		return nil
	})
	fmt.Printf("%v %v\n", err3, ok3) // my error false
}
